/**
 * 将嵌套对象扁平化为单层对象
 * @description 将多层嵌套的对象转换为单层对象，使用点号（.）作为分隔符表示层级关系
 * @param {Object} obj - 需要扁平化的对象
 * @returns {Object} 扁平化后的对象
 * @example
 * const nested = {
 *   name: 'zs',
 *   age: 12,
 *   info: {
 *     likes: { 
 *       fruit: 'apple'
 *     }
 *   }
 * };
 * 
 * flattenObject(nested);
 * // 返回:
 * // {
 * //   'name': 'zs',
 * //   'age': 12,
 * //   'info.likes.fruit': 'apple'
 * // }
 */
export const flattenObject = (obj: Record<string, any>): Record<string, unknown> => {
  const result: Record<string, unknown> = {};

  function flatten(current: unknown, prefix: string = ''): void {
    // 如果是 null 或 undefined，直接返回
    if (current == null) {
      result[prefix] = current;
      return;
    }

    // 如果是对象但不是数组
    if (typeof current === 'object' && !Array.isArray(current)) {
      // 遍历对象的所有可枚举属性
      Object.keys(current as object).forEach(key => {
        const newPrefix = prefix ? `${prefix}.${key}` : key;
        flatten((current as Record<string, unknown>)[key], newPrefix);
      });
      return;
    }

    // 其他情况（包括数组和基本类型）直接赋值
    if (prefix) {
      result[prefix] = current;
    }
  }

  flatten(obj);
  return result;
};
